{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "07311335",
   "metadata": {},
   "source": [
    "# Json parser\n",
    "\n",
    "Используем JSON-парсер и библиотеку промптов для генерации синонимов"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "77e49a3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains import LLMChain\n",
    "from langchain.chat_models.gigachat import GigaChat\n",
    "from langchain.output_parsers.json import SimpleJsonOutputParser\n",
    "from langchain.prompts import load_prompt\n",
    "from langchain.prompts.chat import ChatPromptTemplate, SystemMessagePromptTemplate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ace93488",
   "metadata": {},
   "outputs": [],
   "source": [
    "giga = GigaChat(credentials=...)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e71cc437",
   "metadata": {},
   "source": [
    "## Загружаем промт\n",
    "Рекомендуется использовать промпты из хаба, т.к. они уже проверены и вероятно будут работать лучше, чем промпты написанные руками."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9240a3ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "propmpt = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        SystemMessagePromptTemplate(\n",
    "            #             prompt = \"\"\"Сгенерируй от {dataset_size_min} до {dataset_size_max} синонимов для слова \"{subject}\".\n",
    "            # Результат верни в формате JSON списка без каких либо пояснений, например, [\"синоним1\", \"синоним2\", \"синоним3\", \"синоним4\"].\n",
    "            # Не дублируй фразы.\"\"\"\n",
    "            prompt=load_prompt(\"lc://prompts/synonyms/synonyms_generation.yaml\")\n",
    "        )\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c22e4bb8",
   "metadata": {},
   "source": [
    "Также можно загружать промпты из локальных файлов:\n",
    "    \n",
    "```python\n",
    "system_prompt = load_prompt(\"../../../../../hub/prompts/qna/qna_system.yaml\")\n",
    "user_prompt = load_prompt(\"../../../../../hub/prompts/qna/qna_user.yaml\")\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4da7c865",
   "metadata": {},
   "source": [
    "## Сборка цепочки\n",
    "Поскольку мы просим у LLM вернуть массив строк в формате JSON, то используем JSON парсер, чтобы сразу получить структурированный результат."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ad62eacc",
   "metadata": {},
   "outputs": [],
   "source": [
    "chain = LLMChain(llm=giga, prompt=propmpt, output_parser=SimpleJsonOutputParser())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "96657765",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['автомобиль',\n",
       " 'машина',\n",
       " 'велосипед',\n",
       " 'мотоцикл',\n",
       " 'самокат',\n",
       " 'трактор',\n",
       " 'трамвай',\n",
       " 'автобус']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(dataset_size_min=5, dataset_size_max=10, subject=\"транспортное средство\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "568c392d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['мобильный телефон',\n",
       " 'смартфон',\n",
       " 'коммуникатор',\n",
       " 'наладонник',\n",
       " 'планшет',\n",
       " 'смарт-часы']"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(dataset_size_min=5, dataset_size_max=10, subject=\"смартфон\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a914f2ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['кувалда',\n",
       " 'молот',\n",
       " 'клевец',\n",
       " 'долото',\n",
       " 'гвоздодер',\n",
       " 'стамеска',\n",
       " 'отбойный молоток']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(dataset_size_min=5, dataset_size_max=10, subject=\"молоток\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
